﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using Entidades;
using System.Collections;
using System.Data.SqlClient;

namespace CapaDatos.Adapters
{
   public class PagarCuotaAlumnoAdapter
    {
       
       BDRinconLuzEntities contexto;

       public PagarCuotaAlumnoAdapter()
        {
            contexto = RinconLuzContext.Context;
        }

       public PagarCuotaAlumnoAdapter(string edicion)
        {
            contexto = RinconLuzContext.ContextNew;
        }

        public void Agregar(CuotaAlumno entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && entidad.ChangeTracker.State == ObjectState.Added)
            {
                contexto.RegistrarCambios(entidad);
                contexto.RealizarCambios();
            }
        }

        public void Eliminar(CuotaAlumno entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            IObjectSet<CuotaAlumno> objectSet = contexto.CrearSet<CuotaAlumno>();

            objectSet.Attach(entidad);
            objectSet.DeleteObject(entidad);
        }



        public void Modificar(CuotaAlumno entidad)
        {
            if (entidad == null)
            {
                throw new ArgumentNullException("entidad", "La entidad no puede ser nula.");
            }

            if (entidad.ChangeTracker != null && (entidad.ChangeTracker.State & ObjectState.Deleted) != ObjectState.Deleted)
            {
                entidad.MarkAsModified();
            }

            contexto.SaveChanges();
        }


        public IEnumerable<CuotaAlumno> Obtener()
        {
            return contexto.CrearSet<CuotaAlumno>();
        }

       
        
        public CuotaAlumno ObtenerEntidad(Guid legajoAlumno, string mes, int año)
        {

            var Entidad = (from v in contexto.CuotaAlumno
                           where v.Legajo_Alumno == legajoAlumno &&
                           v.MesPago == mes &&
                           v.AñoPago == año &&
                            v.Eliminada != true
                           select v).First();
            return Entidad;

        }



        public List<ViewEntity> ObtenerAlumnosPorMesAño(string mes, int año)
        {           

            List<ViewEntity> ListaFinal = new List<ViewEntity>();

            var Legajos = (from v in contexto.InscripcionCicloLectivo
                           where v.Turno.CicloLectivo.FechaDesde.Value.Year == año &&
                           v.Eliminada != true
                           select v.LegajoAlumno).Except(from v in contexto.CuotaAlumno
                                                         where v.MesPago == mes &&
                                                                 v.AñoPago == año &&
                                                                 v.Eliminada != true 
                                                                 select v.Legajo_Alumno);

            if (Legajos.Count() > 0)
            {
                var Lista = (from v in contexto.Alumno
                             where Legajos.Contains(v.LegajoAlumno)
                             select v).ToList();
               

                foreach (var item in Lista)
                {                   
                    ListaFinal.Add(new ViewEntity(item.LegajoAlumno, item.ApellidoAlumno + ", " + item.NombreAlumno + " / DNI: " + item.DniAlumno));

                }

                ListaFinal = ListaFinal.OrderBy(v => v.Descripcion).ToList();
            }

            return ListaFinal;
        }




        public List<ViewEntity> ObtenerCuotasPagasPorMesAño(string mes, int año)
        {

            List<ViewEntity> ListaFinal = new List<ViewEntity>();

            var Legajos = (from v in contexto.CuotaAlumno
                                where v.MesPago == mes &&
                                        v.AñoPago == año &&
                                        v.Eliminada != true
                                select v.Legajo_Alumno).ToList();

            if (Legajos.Count() > 0)
            {
                var Lista = (from v in contexto.Alumno
                             where Legajos.Contains(v.LegajoAlumno)
                             select v).ToList();


                foreach (var item in Lista)
                {
                    ListaFinal.Add(new ViewEntity(item.LegajoAlumno, item.ApellidoAlumno + ", " + item.NombreAlumno + " / DNI: " + item.DniAlumno));

                }

                ListaFinal = ListaFinal.OrderBy(v => v.Descripcion).ToList();
            }

            return ListaFinal;
        }


        public bool ExistenCuotasPendientes(string mes, int año)
        {

             var Legajos = (from v in contexto.InscripcionCicloLectivo
                           where v.Turno.CicloLectivo.FechaDesde.Value.Year == año &&
                           v.Eliminada != true
                           select v.LegajoAlumno).Except(from v in contexto.CuotaAlumno
                                                         where v.MesPago == mes &&
                                                                 v.AñoPago == año &&
                                                                 v.Eliminada != true 
                                                                 select v.Legajo_Alumno);

             if (Legajos.Count() > 0)
                 return true;
             else
                 return false;

             
        }


        public List<InformePagoCuotaMes> ObtenerAlumnosCuotasNoPagas(string mes, int año)
        {

            List<InformePagoCuotaMes> ListaFinal = new List<InformePagoCuotaMes>();

            var Legajos = (from v in contexto.InscripcionCicloLectivo
                           where v.Turno.CicloLectivo.FechaDesde.Value.Year == año &&
                           v.Eliminada != true
                           select v.LegajoAlumno).Except(from v in contexto.CuotaAlumno
                                                         where v.MesPago == mes &&
                                                                 v.AñoPago == año &&
                                                                 v.Eliminada != true
                                                         select v.Legajo_Alumno);

            if (Legajos.Count() > 0)
            {
                var Lista = (from v in contexto.Alumno
                             where Legajos.Contains(v.LegajoAlumno)
                             select v).ToList();


                foreach (var item in Lista)
                {
                    ListaFinal.Add(new InformePagoCuotaMes(item.ApellidoAlumno.Trim() + ", " + item.NombreAlumno.Trim(), "No"));

                }

                ListaFinal = ListaFinal.OrderBy(v => v.ApellidoNombreAlumno).ToList();
            }

            return ListaFinal;
        }

        public List<InformePagoCuotaMes> ObtenerAlumnosCuotasPagas(string mes, int año)
        {

            List<InformePagoCuotaMes> ListaFinal = new List<InformePagoCuotaMes>();

            var Legajos = (from v in contexto.CuotaAlumno
                                    where v.MesPago == mes &&
                                            v.AñoPago == año &&
                                            v.Eliminada != true
                                    select v.Legajo_Alumno);

            if (Legajos.Count() > 0)
            {
                var Lista = (from v in contexto.Alumno
                             where Legajos.Contains(v.LegajoAlumno)
                             select v).ToList();


                foreach (var item in Lista)
                {
                    ListaFinal.Add(new InformePagoCuotaMes(item.ApellidoAlumno.Trim() + ", " + item.NombreAlumno.Trim(), "Si"));

                }

                ListaFinal = ListaFinal.OrderBy(v => v.ApellidoNombreAlumno).ToList();
            }

            return ListaFinal;
        }






        public List<InformePagoCuotaMes> ObtenerAlumnosCuotasPagasYNoPagas(string mes, int año)
        {

            List<InformePagoCuotaMes> ListaFinal = new List<InformePagoCuotaMes>();

            var Alumnos = (from v in contexto.InscripcionCicloLectivo
                           where v.Turno.CicloLectivo.FechaDesde.Value.Year == año &&
                           v.Eliminada != true
                           select v.Alumno).ToList();
                           
                        
            if (Alumnos.Count() > 0)
            {
                foreach(var item in Alumnos)
                {
                    var PagoCuota = (from v in contexto.CuotaAlumno
                                     where v.MesPago == mes &&
                                             v.AñoPago == año &&
                                             v.Legajo_Alumno == item.LegajoAlumno &&
                                             v.Eliminada != true
                                     select v).Any();

                    if (PagoCuota)
                    {
                        ListaFinal.Add(new InformePagoCuotaMes(item.ApellidoAlumno.Trim() + ", " + item.NombreAlumno.Trim(), "Si"));
                    }
                    else
                    {
                        ListaFinal.Add(new InformePagoCuotaMes(item.ApellidoAlumno.Trim() + ", " + item.NombreAlumno.Trim(), "No"));
                    }
                }


                ListaFinal = ListaFinal.OrderByDescending(v => v.PagoCuota).ToList();
               
            }



            return ListaFinal;
        }





        public List<InformePagoCuotaMes> ObtenerCuotasPagasYNoPagasPorAlumno(Guid legajoAlumno, CicloLectivo ciclo)
        {

            List<InformePagoCuotaMes> ListaFinal = new List<InformePagoCuotaMes>();


            for (int i = ciclo.FechaDesde.Value.Month; i <= ciclo.FechaHasta.Value.Month; i++)
            {

                string nombreMes = ObtenerNombreMes(i);

                var PagoCuota = (from v in contexto.CuotaAlumno
                                 where v.MesPago == nombreMes  &&
                                         v.AñoPago == ciclo.FechaHasta.Value.Year &&
                                         v.Legajo_Alumno == legajoAlumno &&
                                         v.Eliminada != true
                                 select v).Any();

                if (PagoCuota)
                {
                    ListaFinal.Add(new InformePagoCuotaMes(nombreMes, "Si"));
                }
                else
                {
                    ListaFinal.Add(new InformePagoCuotaMes(nombreMes, "No"));
                }


            }
                        
            return ListaFinal;
        }



        internal string ObtenerNombreMes(int mes)
        {

            switch (mes)
            {

                case 1:
                    return "Enero";

                case 2:
                    return "Febrero";

                case 3:
                    return "Marzo";

                case 4:
                    return "Abril";

                case 5:
                    return "Mayo";

                case 6:
                    return "Junio";

                case 7:
                    return "Julio";

                case 8:
                    return "Agosto";

                case 9:
                    return "Septiembre";

                case 10:
                    return "Octubre";

                case 11:
                    return "Noviembre";

                case 12:
                    return "Diciembre";

                default: return "Ninguno";

            }

        }


       

    }
}
